/**
 * 
 */
package edu.erpan.web.administracion;

import java.io.IOException;
import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.el.ELContext;
import javax.el.ExpressionFactory;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.event.MethodExpressionActionListener;
import javax.servlet.http.HttpServletRequest;

import org.icefaces.ace.component.menubar.MenuBar;
import org.icefaces.ace.component.menuitem.MenuItem;
import org.icefaces.ace.component.submenu.Submenu;
import org.icefaces.ace.model.DefaultMenuModel;

import edu.erpan.bl.entities.administracion.Modulo;
import edu.erpan.bl.entities.administracion.Rol;
import edu.erpan.bl.entities.administracion.Usuario;
import edu.erpan.fachada.administracion.IUsuarioFachada;
import edu.erpan.fachada.administracion.UsuarioFachada;
import edu.erpan.util.entityManager.exceptions.QueryException;
import edu.erpan.web.util.Recursos;

/**
 * @author Jeison
 *
 */
public class MenuBean implements Serializable {

	/**
	 * @author Jeison
	 * @date 12/06/2013
	 */
	private static final long serialVersionUID = 8554477845839991136L;
	private Usuario usuario;
	private String nombreUsuario="";
	private String tooltipNombreUsuario="";
	private boolean sesionIniciada;
	
	
	private MenuBar menuBar;
	private DefaultMenuModel menuModel;
	
	private String ubicacionPagina;
	private List<Rol> roles;
	
	/**
	 * 
	 */
	@SuppressWarnings("unchecked")
	public MenuBean() {
		// TODO Auto-generated constructor stub
		try{
			
			this.usuario=Recursos.getInstance().verficarInicioSession();
			
			if(usuario==null){
				return;
			}else{
				sesionIniciada=true;
			}
			
			if(menuModel==null){
				menuModel=new DefaultMenuModel();
			}
			if(menuBar==null){
				menuBar=new MenuBar();
			}
			menuBar.getChildren().clear();
			roles=(List<Rol>)  FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("idRol");
			IUsuarioFachada usuarioFachada=new UsuarioFachada();
			
			StringBuffer stringBuffer=new StringBuffer();
			if(usuario.getPersona().getNombres()!=null){
				stringBuffer.append(usuario.getPersona().getNombres());
			}
			if(usuario.getPersona().getPrimerApellido()!=null){
				stringBuffer.append(" ").append(usuario.getPersona().getPrimerApellido());
			}
			if(usuario.getPersona().getSegundoApellido()!=null){
				stringBuffer.append(" ").append(usuario.getPersona().getSegundoApellido());
			}
			
			this.tooltipNombreUsuario="";
			
			if(this.roles!=null&&this.roles.size()>0){
				if(this.roles.size()>1){
					stringBuffer.append(" - ").append("Multiusuario");
					for (Rol rol : this.roles) {
						this.tooltipNombreUsuario+=rol.getNombre()+", ";
					}
					if (this.tooltipNombreUsuario.endsWith(", ")) {
						this.tooltipNombreUsuario=this.tooltipNombreUsuario.substring(0,this.tooltipNombreUsuario.length()-2);
					}
				}else{
					stringBuffer.append(" - ").append(this.roles.get(0).getNombre());
					this.tooltipNombreUsuario=this.roles.get(0).getNombre();
				}
			}
			this.nombreUsuario=stringBuffer.toString();
			
			HashMap<Integer, UIComponent> posicionModulo=new HashMap<Integer, UIComponent>(0);
			
			List<Modulo> modulos=usuarioFachada.consultarModulosPorRol(this.roles);
//			List<Modulo> modulos=this.rol.getModulos();
			
			for(Modulo modulo:modulos){
				UIComponent item=null;
				if(!posicionModulo.containsKey(modulo.getIdmodulo())){
					item=crearComponente(modulo);
					posicionModulo.put(modulo.getIdmodulo(), item);
				}else{
					item=posicionModulo.get(modulo.getIdmodulo());
				}
				
				
				if(modulo.getModuloPadre()==null){
					//menuBar.getChildren().add(item);
					if(item instanceof Submenu){
						menuModel.addSubmenu(item);
					}else{
						if(item instanceof MenuItem){
							menuModel.addMenuItem(item);
						}
					}
				}else{
					UIComponent itemPadre=posicionModulo.get(modulo.getModuloPadre().getIdmodulo());
					if(itemPadre==null){
						itemPadre= crearComponente(modulo.getModuloPadre());
						posicionModulo.put(modulo.getModuloPadre().getIdmodulo(), itemPadre);
					}
					
					itemPadre.getChildren().add(item);
				}
					
				
				//llenarMenu(modulo, item,posicionModulo);
				
			}
			
			//menuModel.getMenus().clear();
			//menuModel.addMenu(menuBar);
		} catch (QueryException e) {
			// TODO: handle exception
			String mensaje=Recursos.getInstance().getMensaje(Recursos.MENSAJE_ERROR_INESPERADO);
			Recursos.getInstance().addMessagePage(Recursos.getInstance().getMensaje(Recursos.ID_MENSAJES),Recursos.ERROR, mensaje);
		}catch (Exception e) {
			String mensaje=Recursos.getInstance().getMensaje(Recursos.MENSAJE_ERROR_INESPERADO);
			Recursos.getInstance().addMessagePage(Recursos.getInstance().getMensaje(Recursos.ID_MENSAJES),Recursos.ERROR, mensaje);
		}
	}
	
	private UIComponent crearComponente(Modulo modulo){
		
		ELContext elContext = FacesContext.getCurrentInstance().getELContext();
		ExpressionFactory expressionFactory = FacesContext.getCurrentInstance().getApplication().getExpressionFactory();
		
		UIComponent item=null;
		if(modulo.getModulos().isEmpty()){
			item=new MenuItem();
			item.setId("menuItem_"+modulo.getIdmodulo());
			((MenuItem)item).setValue(modulo.getNombre());
			((MenuItem)item).addActionListener(new MethodExpressionActionListener(expressionFactory.createMethodExpression(elContext, 
					"#{menuBean.redireccionar}", null, new Class[] { ActionEvent.class })));
		}else{
			item=new Submenu();
			item.setId("subMenu_"+modulo.getIdmodulo());
			((Submenu)item).setLabel(modulo.getNombre());
			((Submenu)item).setIcon("ui-icon ui-icon-contact");
		}
		
		return item;
	}
	
	public void redireccionar(ActionEvent evento){
		MenuItem componente= (MenuItem)evento.getComponent();
		String id=componente.getId().split("_")[1];
		UsuarioFachada usuarioFachada=new UsuarioFachada();
		Modulo modulo=new Modulo();
		modulo.setIdmodulo(Integer.parseInt(id));
		try {
			modulo=usuarioFachada.consultarModulo(modulo);
		
			ubicacionPagina=modulo.getUbicacionPaginaInicio();
			
			if(ubicacionPagina!=null&& ubicacionPagina.trim().isEmpty()){
				ubicacionPagina=null;
			}
			FacesContext context=FacesContext.getCurrentInstance();
			Map<String, Object>map=context.getExternalContext().getSessionMap();
			map.remove(modulo.getBean());
			HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest();
	        String path=request.getContextPath();
			context.getExternalContext().redirect(path+ubicacionPagina.replace("xhtml", "iface"));
		} catch (QueryException e) {
			// TODO Auto-generated catch block
			String mensaje=Recursos.getInstance().getMensaje(Recursos.MENSAJE_ERROR_INESPERADO);
			Recursos.getInstance().addMessagePage(Recursos.getInstance().getMensaje(Recursos.ID_MENSAJES),Recursos.ERROR, mensaje);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			String mensaje=Recursos.getInstance().getMensaje(Recursos.MENSAJE_ERROR_INESPERADO);
			Recursos.getInstance().addMessagePage(Recursos.getInstance().getMensaje(Recursos.ID_MENSAJES),Recursos.ERROR, mensaje);
		}
	}
	
	public void cerrarSesion(ActionEvent evento){
		Recursos.getInstance().cerrarSesion();
	}
	

	public MenuBar getMenuBar() {
		return menuBar;
	}

	public void setMenuBar(MenuBar menuBar) {
		this.menuBar = menuBar;
	}

	public DefaultMenuModel getMenuModel() {
		return menuModel;
	}

	public void setMenuModel(DefaultMenuModel menuModel) {
		this.menuModel = menuModel;
	}

	public String getUbicacionPagina() {
		return ubicacionPagina;
	}

	public void setUbicacionPagina(String ubicacionPagina) {
		this.ubicacionPagina = ubicacionPagina;
	}

	/**
	 * @return the usuarSio
	 *
	 * @author Jeison
	 * @date 16/09/2012
	 */
	public Usuario getUsuario() {
		return usuario;
	}

	/**
	 * @param usuarSio the usuarSio to set
	 * 
	 * @author Jeison
	 * @date 16/09/2012
	 */
	public void setUsuario(Usuario usuarSio) {
		this.usuario = usuarSio;
	}

	/**
	 * @return the nombreUsuario
	 *
	 * @author Jeison
	 * @date 16/09/2012
	 */
	public String getNombreUsuario() {
		return nombreUsuario;
	}

	/**
	 * @param nombreUsuario the nombreUsuario to set
	 * 
	 * @author Jeison
	 * @date 16/09/2012
	 */
	public void setNombreUsuario(String nombreUsuario) {
		this.nombreUsuario = nombreUsuario;
	}

	/**
	 * @return the sesionIniciada
	 *
	 * @author Jeison
	 * @date 16/09/2012
	 */
	public boolean isSesionIniciada() {
		if(!sesionIniciada){
			Recursos.getInstance().verficarInicioSession();
		}
		return sesionIniciada;
	}

	/**
	 * @param sesionIniciada the sesionIniciada to set
	 * 
	 * @author Jeison
	 * @date 16/09/2012
	 */
	public void setSesionIniciada(boolean sesionIniciada) {
		this.sesionIniciada = sesionIniciada;
	}

	public String getTooltipNombreUsuario() {
		return tooltipNombreUsuario;
	}

	public void setTooltipNombreUsuario(String tooltipNombreUsuario) {
		this.tooltipNombreUsuario = tooltipNombreUsuario;
	}

	public List<Rol> getRoles() {
		return roles;
	}

	public void setRoles(List<Rol> roles) {
		this.roles = roles;
	}

	

}
